﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using DOMINIO;
using BL;
using DAL;
using System.Web.Profile;

namespace Presentacion
{
    public partial class frmVenta : System.Web.UI.Page
    {
        ProductoBL prodBL;
        EmpleadoBL empBL;
        ClienteBL cliBL;
        VentaBL ventBL;
        Venta venta;
        DetalleVenta detalle;
        DetalleVentaDAL detventDAL;
        public static Int32 idProducto;
        public static Int32 idCliente;
        public static Int32 idEmpleado;
        public static Int32 idVenta;
        int band = 0;

        protected void Page_Load(object sender, EventArgs e)
        {
            prodBL = new ProductoBL();
            cliBL = new ClienteBL();
            empBL = new EmpleadoBL();
            ventBL = new VentaBL();
            detventDAL = new DetalleVentaDAL();

            object obj = Request.QueryString["acc"];
            object idVenta = Request.QueryString["IdVent"];
            txtFecha.Text = Convert.ToString(DateTime.Now);

            if (!Page.IsPostBack)
            {
                if (obj != null)
                {
                    if (obj.ToString() == "editar")
                    {
                        band = 1;
                        venta = ventBL.BuscarPorID(Int32.Parse(idVenta.ToString()));
                        VentaDataBind(venta);
                        //btnCliente.Enabled= false;
                        //btnEmpleado.Enabled = false;
                    }
                    if (obj.ToString() == "nuevo")
                    {
                        venta = new Venta { Id = 0, Fecha = DateTime.Now };

                        VentaDataBind(venta);
                        txtFecha.Text = Convert.ToString(DateTime.Now);
                        txtProductoCant.Focus();

                        ProfileBase profile = HttpContext.Current.Profile;

                        idEmpleado = 2;//Int32.Parse(profile.GetPropertyValue("CodEmpleado").ToString());
                        txtEmpleado.Text = profile.GetPropertyValue("Empleado").ToString();


                    }
                }
            }

        }

        private void VentaDataBind(Venta venta)
        {
            Cache.Insert("venta", venta);

            txtId.Text = venta.Id.ToString();
            txtFecha.Text = venta.Fecha.ToShortDateString();
            if (band == 1)
            {
                txtEmpleado.Text = venta.EmpleadoA.NombreCompleto;
                txtClienteRuc.Text = venta.ClienteA.DniRuc;
                txtClienteNomb.Text = venta.ClienteA.NombreCompleto;
                txtClienteDirección.Text = venta.ClienteA.Direccion;
                idEmpleado = venta.IdEmpleado;
                idCliente = venta.IdCliente;
            }
            lblTotal.Text = String.Format("{0:c}", venta.Total);

            Total(venta.Total.ToString());

            gvDetalle.DataSource = venta.Detalle;
            gvDetalle.DataBind();
        }

        private void Total(string total)
        {
            Label lbt;
            lbt = (Label)gvDetalle.TemplateControl.FindControl(UniqueID + "lblTotalGrid");
            //lbt.Text = total;  
        }

        protected void gvProducto_SelectedIndexChanged(object sender, EventArgs e)
        {
            idProducto = Int32.Parse(gvProducto.SelectedValue.ToString());
            lblMensaje.Text = "Codigo de Producto: " + idProducto + ".";

            Producto producto = prodBL.BuscarProductoPorCodigo(idProducto);

            ProductoDataBind(producto);
        }

        private void ProductoDataBind(Producto producto)
        {
            if (producto != null)
            {
                txtProductoId.Text = producto.Id.ToString();
                txtProductoDesc.Text = producto.Descripcion;
                txtProductoPrec.Text = producto.Precio.ToString();
                txtProductoCant.Text = "1";

                Cache.Insert("producto", producto);
            }
            else
            {
                lblMensaje.Text = "El producto no encontrado";
            }
        }

        protected void gvEmpleado_SelectedIndexChanged(object sender, EventArgs e)
        {
            idEmpleado = Int32.Parse(gvEmpleado.SelectedValue.ToString());
            lblMensaje.Text = "Codigo de Empleado: " + idEmpleado + ".";

            Empleado empleado = empBL.BuscarEmpleadoPorCodigo(idEmpleado);
            txtEmpleado.Text = empleado.NombreCompleto;
        }

        protected void gvCliente_SelectedIndexChanged(object sender, EventArgs e)
        {
            idCliente = Int32.Parse(gvCliente.SelectedValue.ToString());
            lblMensaje.Text = "Codigo de Cliente: " + idCliente + ".";

            Cliente cliente = cliBL.BuscarClientePorCodigo(idCliente);
            txtClienteNomb.Text = cliente.NombresComp;
            txtClienteRuc.Text = cliente.DniRuc;
            txtClienteDirección.Text = cliente.Direccion;
        }

        protected void btnAgregar_Click(object sender, EventArgs e)
        {
            if (txtProductoCant.Text != "")
            {
                NewMethod();
                Producto producto = (Producto)Cache.Get("producto");

                producto = prodBL.BuscarProductoPorCodigo(idProducto);

                detalle = new DetalleVenta
                {
                    ProductoA = producto,
                    IdProducto = producto.Id,
                    Cantidad = Decimal.Parse(txtProductoCant.Text),
                    Precio = Decimal.Parse(txtProductoPrec.Text),
                    Activo = Boolean.Parse("True")
                };

                var existe =
                    from det in venta.Detalle
                    where det.ProductoA.Id == producto.Id
                    select det;

                if (existe.SingleOrDefault() == null)
                {
                    venta.Detalle.Add(detalle);

                    venta.Total = venta.Detalle.Sum(dp => dp.Monto);

                    gvDetalle.DataSource = venta.Detalle;
                    gvDetalle.DataBind();

                    lblTotal.Text = venta.Total.ToString();

                    Cache.Insert("venta", venta);
                    Cache.Remove("producto");

                    txtProductoId.Text = string.Empty;
                    txtProductoDesc.Text = string.Empty;
                    txtProductoCant.Text = string.Empty;
                    txtProductoPrec.Text = string.Empty;

                    //txtCodigo.Focus();
                }
                else
                {
                    lblMensaje.Text = "El producto ya se encuentra en la venta";
                }
                lblMensaje.Text = "";
            }
            else
                lblMensaje.Text = "Ingrese un producto para agregarlo";

        }

        private void NewMethod()
        {
            venta = (Venta)Cache.Get("venta");
        }

        protected void btnGuardar_Click(object sender, EventArgs e)
        {
            Venta venta = (Venta)Cache.Get("venta");

            venta.Id = Int32.Parse(txtId.Text);
            venta.Fecha = DateTime.Now;
            venta.Total = venta.Detalle.Sum(dv => dv.Monto);//Decimal.Parse(lblTotal.Text);
            venta.IdEmpleado = idEmpleado;
            venta.IdCliente = idCliente;
            venta.Activo = Boolean.Parse("True");

            //List<DetalleVenta> listaDetQuitar = Cache.Get("QuitarDetalles") as List<DetalleVenta>;

            //if (listaDetQuitar != null)
            //{
            //    ///Implemtar metodo para quitar detalles... ventaBL.QuitarDetalle(listaDetQuitar)

            //    int idProducto = int.Parse(Request.QueryString["idProducto"].ToString());
            //    int idVenta = int.Parse(Request.QueryString["idVenta"].ToString());

            //    //detventDAL.DeleteDetalleVenta(idVenta, idProducto);

            //    //ventBL.DeleteDetalleVenta(idVenta, idProducto);
            //}

            ventBL.Guardar(venta);
            Response.Redirect("frmGestionarVenta.aspx");
        }

        protected void btnBuscaProdId_Click(object sender, EventArgs e)
        {
            if (txtProductoId.Text != "")
            {
                idProducto = Int32.Parse(txtProductoId.Text);
                Producto producto = prodBL.BuscarProductoPorCodigo(idProducto);
                ProductoDataBind(producto);
            }
            else
                lblMensaje.Text = "ingrese codigo del producto!!!";
        }

        protected void btnDesactivar_Click(object sender, EventArgs e)
        {
            Venta venta = (Venta)Cache.Get("venta");

            venta.Id = Int32.Parse(txtId.Text);
            venta.Fecha = DateTime.Now;
            venta.Total = venta.Detalle.Sum(dv => dv.Monto);
            venta.IdEmpleado = idEmpleado;
            venta.IdCliente = idCliente;
            venta.Activo = Boolean.Parse("False");



            ventBL.Guardar(venta);
            Response.Redirect("frmGestionarVenta.aspx");
        }

        protected void gvDetalle_SelectedIndexChanged(object sender, EventArgs e)
        {
            NewMethod();
            foreach (DetalleVenta d in venta.Detalle)
            {
                if (d.IdProducto == Int32.Parse(gvDetalle.SelectedValue.ToString()))
                {
                    //venta.Detalle.Remove(d);
                    d.Cantidad = 0;
                    d.Activo = false;
                }
            }
            venta.Total = venta.Detalle.Sum(dp => dp.Monto);
            gvDetalle.DataSource = venta.Detalle;
            gvDetalle.DataBind();
            lblTotal.Text = venta.Total.ToString();

            Cache.Insert("venta", venta);
            Cache.Remove("producto");
        }

        protected void Button1_Click(object sender, EventArgs e)
        {
            Response.Redirect("frmVenta.aspx");
        }

        protected void btnEmpleado_Click(object sender, EventArgs e)
        {

        }

        protected void gvDetalle_RowCommand(object sender, GridViewCommandEventArgs e)
        {
            if (e.CommandName == "Quitar")
            {
                int index = int.Parse(e.CommandArgument.ToString());

                Venta venta = Cache.Get("venta") as Venta;


                //List<DetalleVenta> listaDetQuitar = Cache.Get("QuitarDetalles") as List<DetalleVenta>;

                //if (listaDetQuitar != null)
                //{
                //    listaDetQuitar = new List<DetalleVenta>();
                //    listaDetQuitar.Add(venta.Detalle[index]);
                //}
                //else
                //{
                //    listaDetQuitar = new List<DetalleVenta>();
                //    listaDetQuitar.Add(venta.Detalle[index]);
                //}
                if (venta.Id > 0)
                {
                    detventDAL.DeleteDetalleVenta(venta.Detalle[index]);
                }

                venta.Detalle.RemoveAt(index);

                venta.Total = venta.Detalle.Sum(dv => dv.Monto);

                VentaDataBind(venta);

                Cache.Insert("venta", venta);
            }
        }

    }
}